//
//  EmoticonViewController.swift
//  CZEmoticon
//
//  Created by Apple on 15/12/4.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit

/* 
    当控制器的view作为自定键盘时:
        在自定义键盘还没有显示的时候,就会执行viewDidLoad
        在viewDidLoad里面,控制器的view的大小是屏幕大小

        在viewWillAppear里面,控制器的view的大小是屏幕大6小

        在viewDidAppear里面,控制器的view的大小是自定义键盘的大小
*/


class EmoticonViewController: UIViewController {
    
    // MARK: 属性
    /// 要添加表情图片的textView, textView不需要强引用
    weak var textView: UITextView?
    
    private let ReuseIdentifier = "EmoticonCell"
    
    /// 按钮的tag起始值
    private let baseTag = 1000
    
    /// 所有表情包模型
    private let packages = EmoticonPackage.packages
    
    /// 构造方法
    init(textView: UITextView) {
        self.textView = textView
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        prepareUI()
        
    }

    // 准备UI
    private func prepareUI() {
        pageControl.pageIndicatorTintColor = UIColor.redColor()
        pageControl.currentPageIndicatorTintColor = UIColor.blackColor()
        pageControl.numberOfPages = 1
        pageControl.currentPage = 0
        
        // 添加子控件
        view.addSubview(collectionView)
        view.addSubview(toolBar)
        view.addSubview(pageControl)
        
        // 添加约束, 少依赖第三方框架
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        toolBar.translatesAutoresizingMaskIntoConstraints = false
        pageControl.translatesAutoresizingMaskIntoConstraints = false
        
        // VLF
        // collectionView 水平方向, 左右都距离父控件0
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[cl]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["cl" : collectionView]))
        
        // toolBar水平方向, 左右都距离父控件0
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[tb]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tb" : toolBar]))
        
        // 垂直方向. 
        // 1.collectionView顶部和父控件顶部重合.
        // 2.collectionView底部和toolBar顶部重合
        // 3.toolBar高度44
        // 4.toolBar底部和父控件重合
        // [tb(44)] 44表示宽度还是高度,看前面的方向是H还是V, H: 宽44, V: 高度44
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[cl]-0-[tb(44)]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["cl" : collectionView, "tb": toolBar]))
        
        view.addConstraint(NSLayoutConstraint(item: pageControl, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: collectionView, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
        
        view.addConstraint(NSLayoutConstraint(item: pageControl, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: collectionView, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 12))
        
        // 设置toolBar内容
        setupToolBar()
        
        // 设置collectionView
        setupCollectionView()
    }
    
    /// 设置toolBar内容
    private func setupToolBar() {
        
        var items = [UIBarButtonItem]()
        
        // 按钮的tag
        var index = baseTag
        
        // 获取表情包模型的名称
        for package in packages {
            // 获取每个表情包的名称
            let title = package.group_name_cn
            
            // 创建按钮
            let button = UIButton()
            
            // 设置文字
            button.setTitle(title, forState: UIControlState.Normal)
            
            // 设置颜色
            button.setTitleColor(UIColor.lightGrayColor(), forState: UIControlState.Normal)
            button.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Highlighted)
            button.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Selected)
            
            // 按钮适应文字大小
            button.sizeToFit()
            
            // 添加点击事件
            button.addTarget(self, action: "itemClick:", forControlEvents: UIControlEvents.TouchUpInside)
            
            // 设置tag
            button.tag = index
            
            // 最近按钮默认高亮
            if index == baseTag {
                switchSelectedButton(button)
            }
            
            // 创建 UIBarButtonItem
            let item = UIBarButtonItem(customView: button)
            
            // 添加item到数组
            items.append(item)
            
            // 添加弹簧
            items.append(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil))
            
            index++
        }
        
        // 移除最后一根弹簧
        items.removeLast()
        
        // 将items数组赋值给toolBar
        toolBar.items = items
    }
    
    // 按钮点击事件
    func itemClick(button: UIButton) {
        print("点击按钮: \(button.tag)")
        
        // 切换到对应的表情包的第一页表情
        // section需要-tag的起始值
        let indexPath = NSIndexPath(forItem: 0, inSection: button.tag - baseTag)
        collectionView.selectItemAtIndexPath(indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.Left)
//        collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.Left, animated: true)
        
        // 让点击的按钮高亮
        switchSelectedButton(button)
    }
    
    /**
    切换选中的按钮,让按钮高亮
    
    - parameter button: 要选中的按钮
    */
    private func switchSelectedButton(button: UIButton) {
        // 让原来选中的按钮,恢复正常
        selectedButton?.selected = false
        
        // 让传入的按钮选中
        button.selected = true
        
        // 赋值
        selectedButton = button
    }
    
    private var selectedButton: UIButton?
    
    /// 设置collectionView
    private func setupCollectionView() {
        // 设置背景
        collectionView.backgroundColor = UIColor(white: 0.8, alpha: 1)
        
        // 注册cell
        collectionView.registerClass(EmocitonCell.self, forCellWithReuseIdentifier: ReuseIdentifier)
        
        // 数据源和代理
        collectionView.dataSource = self
        
        // 设置代理
        collectionView.delegate = self
    }
    
    // MARK: - 懒加载
    /// collectionView
    private lazy var collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: EmoticonLayout())
    
    /// toolBar
    private lazy var toolBar: UIToolbar = UIToolbar()
    
    /// pageControl
    private lazy var pageControl = UIPageControl()
}

// 自定义流水布局,在prepareLayout里面来设置布局参数
class EmoticonLayout: UICollectionViewFlowLayout {
    
    // 在collectionView的layout将要布局的时候会调用,在这里设置布局的参数
    override func prepareLayout() {
        // 根据ucollection的大小来设置layout的大小
        let width = collectionView!.bounds.width / 7
        
        let height = collectionView!.bounds.height / 3
        
        // 设置 layout的item大小
        itemSize = CGSize(width: width, height: height)
        
        // collectionView水平滚动
        scrollDirection = UICollectionViewScrollDirection.Horizontal
        
        // collectionView的cell不要间距
        minimumInteritemSpacing = 0
        minimumLineSpacing = 0
        
        // 取消弹簧效果
        collectionView?.bounces = false
        
        // 不要滚动条
        collectionView?.showsHorizontalScrollIndicator = false
        
        // 分页
        collectionView?.pagingEnabled = true
    }
}

// swift中只有实现协议的方法,才不会报错
extension EmoticonViewController: UICollectionViewDataSource, UICollectionViewDelegate {
    // 返回组
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        // 有几个表情包,就返回几组
        return packages.count
    }
    
    // 某一组,显示多少条数据
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // 获取到每一组对应的表情包模型
        let package = packages[section]
        return package.emoticons.count
    }
    
    // 返回cell
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        // 获取cell.先去缓存池中查找,如果缓存池中找不到,就通过注册的cell类型来创建cell
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(ReuseIdentifier, forIndexPath: indexPath) as! EmocitonCell
        
        // 获取表情包里面的表情. 组(section) -> 表情包 ,indexPath.item -> 某个表情
        let emoticon = packages[indexPath.section].emoticons[indexPath.item]
        
        // 设置cell的模型
        cell.emoticon = emoticon
        
        return cell
    }
    
    // 监听collectionView停止滚动
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        // 获取正在显示的cell的indexPath,没有按顺序排列
        let indexPaths = collectionView.indexPathsForVisibleItems()
        
        // 排序,大的排前面,显示的数量比比一页21个要多3个,因为宽度为小数
        let sortIndexPaths = indexPaths.sort { (e1, e2) -> Bool in
            return e1.item > e2.item
        }
        
//        for index in sortIndexPath {
//            print("index: \(index)")
//        }
        
        // 获取collectionView正在显示的cell的indexPath不要拿到其他页的cell就可以
        let indexPath = sortIndexPaths[10]
        
        print("当前显示的表情包: \(indexPath.section)")
        // indexPath?.section 和 表情包按钮.tag是对应的
        
        // 通过tag找到对应的表情包按钮
        // 通过view.tag来查找view,遍历toolBar查找tag = indexPath.section的view.
        // 先查找自己,如果自己不是,在遍历子控件查找
        // view的tag默认是0
        
        // 按钮的tag是从1000(baseTag)开始的.
        let button = toolBar.viewWithTag(indexPath.section + baseTag) as! UIButton
        
        switchSelectedButton(button)
        
        // 设置pageControl
        
        // 获取所有当前表情包所有表情模型的个数
        let count = packages[indexPath.section].emoticons.count
        
        // 计算当前表情包所有模型有多少页
        let numberOfPages = (count + 20) / 21
        pageControl.numberOfPages = numberOfPages
        
        // 计算当前表情模型属于哪一页
        let current = indexPath.item / 21
        pageControl.currentPage = current
    }
    
    /// collectionView的某个cell被点击
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
//        print("cell被点击: \(indexPath)")
        // 获取到被点击的表情模型
        let emoticon = packages[indexPath.section].emoticons[indexPath.item]
        
        // 将表情插入到textView
        textView?.insertEmoticon(emoticon)
        
        // 最近表情模型不需要参与排序
        if indexPath.section != 0 {
            // 添加到最近表情包, 让表情包来添加
            EmoticonPackage.addFavorate(emoticon)
        }
        
        // 从新刷新collectionView
//        collectionView.reloadSections(NSIndexSet(index: 0))
    }
}

// 自定义表情键盘的cell
class EmocitonCell: UICollectionViewCell {
    
    // cell显示什么内容,根据表情模型
    var emoticon: Emoticon? {
        didSet {
            // 视图根据模型来显示内容
            if emoticon?.pngPath != nil {
                // 设置表情图片
                // contentsOfFile: 不会缓存,使用完就释放了
                // named: 一直缓存在内存中
                emoticonButton.setImage(UIImage(contentsOfFile: emoticon!.pngPath!), forState: UIControlState.Normal)
            } else {    // 没有图片,将按钮的图片设置为nil
                emoticonButton.setImage(nil, forState: UIControlState.Normal)
            }
            
            // 设置emoji表情
//            if emoticon?.emoji != nil {  // 是emoji表情
//                emoticonButton.setTitle(emoticon!.emoji!, forState: UIControlState.Normal)
//            } else {
//                emoticonButton.setTitle(nil, forState: UIControlState.Normal)
//            }
            
            // emoticon?.emoji 有值,就赋值
            // emoticon?.emoji 没有值,就是nil
            emoticonButton.setTitle(emoticon?.emoji, forState: UIControlState.Normal)
            
            // 如果是删除按钮,显示删除按钮图片
            if emoticon!.removeEmoticon {
                emoticonButton.setImage(UIImage(named: "compose_emotion_delete"), forState: UIControlState.Normal)
            }
        }
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 这个frame是有值的
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        prepareUI()
    }
    
    // 准备UI
    private func prepareUI() {
        // 设置按钮背景颜色
//        emoticonButton.backgroundColor = UIColor.brownColor()
        
        // 添加子控件
        contentView.addSubview(emoticonButton)
        
        // 设置按钮的大小大小
        emoticonButton.frame = CGRectInset(bounds, 6, 6)
        
        // 设置字体大小
        emoticonButton.titleLabel?.font = UIFont.systemFontOfSize(32)
        
        // 禁止按钮可以和用户交互
        emoticonButton.userInteractionEnabled = false
    }
    
    // MARK: - 懒加载
    /// 按钮,显示图片,或文字
    private lazy var emoticonButton = UIButton()
}